#ifndef NEXTGEN_PLACEHOLDER_H
#define NEXTGEN_PLACEHOLDER_H

#include <QImage>
#include <QSize>
#include <QString>
#include <QPainter>
#include <QRect>
#include <QColor>
#include <QFont>
#include <QDebug>

/**
 * 新一代占位符系统 - 基于内嵌元数据标识
 *
 * 核心优势：
 * 1. 100%可靠检测 - 基于元数据，无误判
 * 2. 动态尺寸支持 - 适应任意尺寸需求
 * 3. 状态化管理 - 明确的加载状态
 * 4. 高性能 - O(1)检测，无复杂计算
 * 5. 易于维护 - 统一的接口和实现
 */
class NextGenPlaceholder
{
public:
    // 占位符状态枚举
    enum State {
        LOADING,        // 加载中（默认）
        STATE_ERROR,    // 加载失败
        WAITING,        // 等待加载
        PROCESSING,     // 处理中
        CACHE_MISSING   // 缓存缺失
    };

    // === 核心接口 ===

    /**
     * 创建占位符图像
     * @param size 目标尺寸
     * @param state 占位符状态
     * @param message 自定义消息（可选）
     * @return 带有内嵌元数据的占位符图像
     */
    static QImage create(const QSize& size,
                        State state = LOADING,
                        const QString& message = QString());

    /**
     * 检测是否为占位符（100%可靠）
     * @param image 待检测图像
     * @return true=占位符，false=真实内容
     */
    static bool isPlaceholder(const QImage& image);

    /**
     * 检测是否为真实内容（100%可靠）
     * @param image 待检测图像
     * @return true=真实内容，false=占位符
     */
    static bool isRealContent(const QImage& image);

    /**
     * 获取占位符状态
     * @param image 占位符图像
     * @return 占位符状态，如果不是占位符返回LOADING
     */
    static State getState(const QImage& image);

    /**
     * 获取占位符消息
     * @param image 占位符图像
     * @return 占位符消息，如果不是占位符返回空字符串
     */
    static QString getMessage(const QImage& image);

    // === 便捷方法 ===

    /**
     * 创建标准加载占位符
     */
    static QImage createLoading(const QSize& size, const QString& message = "加载中...");

    /**
     * 创建错误占位符
     */
    static QImage createError(const QSize& size, const QString& message = "加载失败");

    /**
     * 创建等待占位符
     */
    static QImage createWaiting(const QSize& size, const QString& message = "等待加载");

    /**
     * 创建处理中占位符
     */
    static QImage createProcessing(const QSize& size, const QString& message = "处理中...");

    /**
     * 创建缓存缺失占位符
     */
    static QImage createCacheMissing(const QSize& size, const QString& message = "缓存缺失");

    // === 调试接口 ===

    /**
     * 获取图像详细信息
     */
    static QString getImageInfo(const QImage& image);

    /**
     * 获取占位符详细信息
     */
    static QString getPlaceholderInfo(const QImage& image);

private:
    // === 元数据管理 ===

    /**
     * 内嵌元数据到图像
     */
    static void embedMetadata(QImage& image, State state, const QString& message);

    /**
     * 从图像提取元数据
     */
    static QString extractMetadata(const QImage& image);

    /**
     * 检查是否有占位符元数据
     */
    static bool hasMetadata(const QImage& image);

    // === 视觉样式 ===

    /**
     * 绘制加载样式
     */
    static void drawLoadingStyle(QPainter& painter, const QRect& rect, const QString& message);

    /**
     * 绘制错误样式
     */
    static void drawErrorStyle(QPainter& painter, const QRect& rect, const QString& message);

    /**
     * 绘制等待样式
     */
    static void drawWaitingStyle(QPainter& painter, const QRect& rect, const QString& message);

    /**
     * 绘制处理样式
     */
    static void drawProcessingStyle(QPainter& painter, const QRect& rect, const QString& message);

    /**
     * 绘制缓存缺失样式
     */
    static void drawCacheMissingStyle(QPainter& painter, const QRect& rect, const QString& message);

    /**
     * 绘制通用背景
     */
    static void drawBackground(QPainter& painter, const QRect& rect, const QColor& bgColor);

    /**
     * 绘制状态图标
     */
    static void drawStateIcon(QPainter& painter, const QRect& iconRect, State state);

    /**
     * 绘制消息文本
     */
    static void drawMessage(QPainter& painter, const QRect& textRect, const QString& message,
                           const QColor& textColor);

    // === 常量定义 ===

    static const QString PLACEHOLDER_SIGNATURE;  // 占位符标识
    static const QString METADATA_KEY;           // 元数据键
    static const int METADATA_VERSION;           // 元数据版本

    // 颜色主题
    static const QColor LOADING_BG_COLOR;
    static const QColor ERROR_BG_COLOR;
    static const QColor WAITING_BG_COLOR;
    static const QColor PROCESSING_BG_COLOR;
    static const QColor CACHE_MISSING_BG_COLOR;

    static const QColor LOADING_TEXT_COLOR;
    static const QColor ERROR_TEXT_COLOR;
    static const QColor WAITING_TEXT_COLOR;
    static const QColor PROCESSING_TEXT_COLOR;
    static const QColor CACHE_MISSING_TEXT_COLOR;
};

#endif // NEXTGEN_PLACEHOLDER_H